home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_01_05 / 1n05034a < prev    next >
Text File  |  1990-08-18  |  2KB  |  40 lines

  1. /* Listing 3 written for Microway NDP C-386 */
  2. /* Copyright 1990 by Gary R. Olhoeft */
  3. void plot_image_32(address)         /* only supports full screen images */
  4. unsigned int address;
  5. {
  6.   reg$edx unsigned edx;             /* required by inline assembler */
  7.   asm("hstdata  equ  0C7000h");     /* Hercules Graphics Station Card */
  8.   asm("hstctrl  equ  0C7D00h");     /* GB1024 34010 host addresses */
  9.   asm("hstadrl  equ  0C7E00h");  
  10.   asm("hstadrh  equ  0C7F00h");  
  11.   edx = address;                    /* address of image */
  12.   asm(edx," push   ebp");           /* save base page (frame pointer) */
  13.   asm("     mov    ebp,esp");       /* make new frame pointer */
  14.   asm("     push   es");            /* save es */ 
  15.   asm("     mov    ax,034h");       /* setup Phar Lap LDT to first Mbyte */
  16.   asm("     mov    es,ax");         /* es points to first Mbyte real memory */
  17.   asm("     mov    ax,es:hstctrl"); /* get 34010 state */
  18.   asm("     push   ax");            /* save 34010 state */
  19.   asm("     or     ax,0D800h");     /* turn on 34010 autoincrement */
  20.   asm("     mov    es:hstctrl,ax"); /* setup 34010 for transfer */
  21.   asm("     xor    ax,ax");         /* zero */
  22.   asm("     mov    es:hstadrl,ax"); /* start at beginning of 34010 */
  23.   asm("     mov    es:hstadrh,ax"); /*     video memory */
  24.   asm("     mov    esi,edx");       /* setup image starting address */
  25.   asm("     mov    ecx,245760");    /* 512x480 pixel count */
  26.   asm("     cld");                  /* clear direction pointer */
  27.   asm("clp: lodsw");                /* get first two bytes of image */
  28.   asm("     xchg   ah,al");         /* swap bytes for correct color order */
  29.   asm("     mov    es:hstdata,ax"); /* send word (half-pixel) to 34010 */
  30.   asm("     lodsb");                /* get third byte */
  31.   asm("     xor    ah,ah");         /* fourth byte is zero (overlay unused) */
  32.   asm("     mov    es:hstdata,ax"); /* send second half-pixel to 34010 */
  33.   asm("     loop   clp");           /* decrement ecx and loop until zero */
  34.   asm("     pop    ax");            /* get saved 34010 state */
  35.   asm("     mov    es:hstctrl,ax"); /* restore 34010 state */
  36.   asm("     pop    es");            /* restore es */
  37.   asm("     pop    ebp");           /* restore base page */
  38. }
  39.  
  40.